#include <stdio.h>
#include "motion/semintf.h"

//create a semaphore
int sem_get(key_t key)
{
    int sem_id;
    sem_id = semget(key, 1, 0666 | IPC_CREAT);
    union semun sem_union;
    sem_union.val = 1;
    if (semctl(sem_id, 0, SETVAL, sem_union) == -1)
    {
        return -1;
    }
    return sem_id;
}

//obtain a semaphore
int sem_p(int sem_id)
{
    struct sembuf sem_buf;
    sem_buf.sem_op = -1;
    sem_buf.sem_flg = SEM_UNDO;
    sem_buf.sem_num = 0;
    if (semop(sem_id, &sem_buf, 1) == -1)
    {
        return -1;
    }
    return 0;
}

//release an semaphore
int sem_v(int sem_id)
{
    struct sembuf sem_buf;
    sem_buf.sem_flg = SEM_UNDO;
    sem_buf.sem_num = 0;
    sem_buf.sem_op = 1;
    if (semop(sem_id, &sem_buf, 1) == -1)
    {
        return -1;
    }
    return 0;
}
